
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import SeriesModel from '../../model/Series.js';
import createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge.js';
import Model from '../../model/Model.js';
import { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';

var SankeySeriesModel =
/** @class */
function (_super) {
	__extends(SankeySeriesModel, _super);

	function SankeySeriesModel() {
		var _this = _super !== null && _super.apply(this, arguments) || this;

		_this.type = SankeySeriesModel.type;
		return _this;
	}
	/**
   * Init a graph data structure from data in option series
   */

	SankeySeriesModel.prototype.getInitialData = function (option, ecModel) {
		var links = option.edges || option.links;
		var nodes = option.data || option.nodes;
		var levels = option.levels;
		this.levelModels = [];
		var levelModels = this.levelModels;

		for (var i = 0; i < levels.length; i++) {
			if (levels[i].depth != null && levels[i].depth >= 0) {
				levelModels[levels[i].depth] = new Model(levels[i], this, ecModel);
			} else {
				if (process.env.NODE_ENV !== 'production') {
					throw new Error('levels[i].depth is mandatory and should be natural number');
				}
			}
		}

		if (nodes && links) {
			var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink);
			return graph.data;
		}

		function beforeLink(nodeData, edgeData) {
			nodeData.wrapMethod('getItemModel', function (model, idx) {
				var seriesModel = model.parentModel;
				var layout = seriesModel.getData().getItemLayout(idx);

				if (layout) {
					var nodeDepth = layout.depth;
					var levelModel = seriesModel.levelModels[nodeDepth];

					if (levelModel) {
						model.parentModel = levelModel;
					}
				}

				return model;
			});
			edgeData.wrapMethod('getItemModel', function (model, idx) {
				var seriesModel = model.parentModel;
				var edge = seriesModel.getGraph().getEdgeByIndex(idx);
				var layout = edge.node1.getLayout();

				if (layout) {
					var depth = layout.depth;
					var levelModel = seriesModel.levelModels[depth];

					if (levelModel) {
						model.parentModel = levelModel;
					}
				}

				return model;
			});
		}
	};

	SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) {
		var nodes = this.option.data || this.option.nodes;
		var dataItem = nodes[dataIndex];
		dataItem.localX = localPosition[0];
		dataItem.localY = localPosition[1];
	};
	/**
   * Return the graphic data structure
   *
   * @return graphic data structure
   */

	SankeySeriesModel.prototype.getGraph = function () {
		return this.getData().graph;
	};
	/**
   * Get edge data of graphic data structure
   *
   * @return data structure of list
   */

	SankeySeriesModel.prototype.getEdgeData = function () {
		return this.getGraph().edgeData;
	};

	SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {
		function noValue(val) {
			return isNaN(val) || val == null;
		} // dataType === 'node' or empty do not show tooltip by default

		if (dataType === 'edge') {
			var params = this.getDataParams(dataIndex, dataType);
			var rawDataOpt = params.data;
			var edgeValue = params.value;
			var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target;
			return createTooltipMarkup('nameValue', {
				name: edgeName,
				value: edgeValue,
				noValue: noValue(edgeValue)
			});
		} // dataType === 'node'
		else {
			var node = this.getGraph().getNodeByIndex(dataIndex);
			var value = node.getLayout().value;
			var name_1 = this.getDataParams(dataIndex, dataType).data.name;
			return createTooltipMarkup('nameValue', {
				name: name_1 != null ? name_1 + '' : null,
				value: value,
				noValue: noValue(value)
			});
		}
	};

	SankeySeriesModel.prototype.optionUpdated = function () {}; // Override Series.getDataParams()

	SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) {
		var params = _super.prototype.getDataParams.call(this, dataIndex, dataType);

		if (params.value == null && dataType === 'node') {
			var node = this.getGraph().getNodeByIndex(dataIndex);
			var nodeValue = node.getLayout().value;
			params.value = nodeValue;
		}

		return params;
	};

	SankeySeriesModel.type = 'series.sankey';
	SankeySeriesModel.defaultOption = {
		// zlevel: 0,
		z: 2,
		coordinateSystem: 'view',
		left: '5%',
		top: '5%',
		right: '20%',
		bottom: '5%',
		orient: 'horizontal',
		nodeWidth: 20,
		nodeGap: 8,
		draggable: true,
		layoutIterations: 32,
		label: {
			show: true,
			position: 'right',
			fontSize: 12
		},
		edgeLabel: {
			show: false,
			fontSize: 12
		},
		levels: [],
		nodeAlign: 'justify',
		lineStyle: {
			color: '#314656',
			opacity: 0.2,
			curveness: 0.5
		},
		emphasis: {
			label: {
				show: true
			},
			lineStyle: {
				opacity: 0.5
			}
		},
		select: {
			itemStyle: {
				borderColor: '#212121'
			}
		},
		animationEasing: 'linear',
		animationDuration: 1000
	};
	return SankeySeriesModel;
}(SeriesModel);

export default SankeySeriesModel;